home *** CD-ROM | disk | FTP | other *** search
- ( ------------------------------------------------------------
- ( This example demonstrates how to expand the animation system
- ( of Real 3D by defining new methods. The file defines three new
- ( methods: ABS_PATH, CHAIN and WEIRD_FORCE. If you add the line
- ( "methods.rpl" LOAD to you rpl-startup, these methods will be
- ( automatically installed.
- ( ------------------------------------------------------------
-
- "r3d3:rpl/sys/vectors.rpl" LOAD
- "r3d3:rpl/sys/objects.rpl" LOAD
- "r3d3:rpl/sys/tags.rpl" LOAD
-
- ( This function is used by all custom methods found from this file.
- ( It fetches addresses of all valid target objects on the stack.
-
- : GetTargets
- 0 ( 0 terminates the list
- o2 FETCH O_GETSUB ( first sub object
- BEGIN
- DUP IF ( test if the object address is not zero
- DUP O.wMETHOD + WFETCH ( fetch the contents of wMETHOD field
- NOT IF ( if zero, valid target
- DUP
- ENDIF
- ELSE ( object address was zero,
- DROP
- EXIT
- ENDIF
- O_GETNEXT ( fetch the address of the next object
- AGAIN
- ;
-
- ( ABS_PATH
- ( This is the actual object procedure for ABS_PATH
-
- : OP_AbsPath
- GetTargets ( fetch target objects
- o1 FETCH O_GETSUB ( find the parameter object
- DUP NOT IF ( if no parameter object, syntax error
- "Parameter Object Missing" ERROR
- ENDIF
- t FFETCH u FFETCH v FFETCH O_EVAL
- 0 M_MOVECOG
- 1 ( return 1, everything is okay
- ;
-
- ( This creates the method ABS_PATH
-
- & OP_AbsPath "ABS_PATH" MTH_CREATE DROP
-
- ( The CHAIN method attemps to keep the distance between all objects
- ( the same.
-
- FVARIABLE fLen
- VVARIABLE vTmp
-
- : Distribute ( 0 aObjects .... fDist )
- fLen FSTORE
- iOP_COG O_PROP vTmp VSTORE
- BEGIN
- DUP
- WHILE
- DUP iOP_COG O_PROP
- vTmp VFETCH VSUB VNORM
- fLen FFETCH VMUL
- vTmp VFETCH VADD vTmp VSTORE
- 0 SWAP vTmp VFETCH 0 M_MOVECOG
- REPEAT
- DROP
- ;
-
- ( Actual CHAIN Object Procedure. The tag "FDIS" can be associated with
- ( the method object in order to define the distance between targets.
- ( If the tag is not defined, the default distance 0.5 is used.
-
- : OP_Chain
- GetTargets
- o1 FETCH "FDIS" O_FINDTAG DUP
- IF
- 4 + FETCH FFETCH
- ELSE
- DROP
- 0.5
- ENDIF
- Distribute
- 1
- ;
-
- ( Create CHAIN method
-
- & OP_Chain "CHAIN" MTH_CREATE DROP
-
- ( The WEIRD_FORCE demonstrates how to create physical oriented `particle-
- ( system` methods. The method generates random force fields affecting to
- ( the velocity and the spin of target objects.
-
- : GetVelForce
- RANDOM 0.5 F- RANDOM 0.5 F- RANDOM 0.5 F-
- ;
-
- : GetSpinForce
- RANDOM 0.5 F- RANDOM 0.5 F- RANDOM 0.5 F-
- ;
-
- : DoWeirdSPI ( aObj )
- "VSPI" O_FINDTAG DUP ( attemp to find VSPI tag of given object
- IF ( found, so
- T.aVAL + FETCH DUP VFETCH ( fetch the tag value
- GetSpinForce ( fetch force affecting to target
- dt FFETCH 6.28 F* VMUL VADD ( calculate new velocity
- 4 ROLL VSTORE ( assign it back to the target`s tag
- ELSE ( not found, so create it
- DROP DUP "CEND" 0 0 0 "VSPI" O_CREATAG DROP
- ENDIF
- ;
-
- : DoWeirdVEL ( aObj )
- "VVEL" O_FINDTAG DUP
- IF
- T.aVAL + FETCH DUP VFETCH GetVelForce dt FFETCH VMUL VADD 4 ROLL VSTORE
- ELSE
- DROP DUP "CEND" 0 0 0 "VVEL" O_CREATAG DROP
- ENDIF
- ;
-
- : OP_WeirdForce
- GetTargets ( fetch all targets on the stack
- BEGIN ( loop through all of them
- DUP
- WHILE
- DUP DoWeirdVEL ( apply force field to velocity
- DUP DoWeirdSPI ( apply force field to spin
- DROP
- REPEAT
- DROP
- 1 ( all OK
- ;
-
- ( Install WEIRD_FORCE method
-
- & OP_WeirdForce "WEIRD FORCE" MTH_CREATE DROP
-